#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<time.h>
#include<conio.h>
void print_frame(int num[],int score);//输出图像
int rand_number_4_2();//随机生成2/4,概率为2-90%,4-10%
void RunGame();//运行整个游戏
int chooce(int num[]);//随机选择2,4生成的位置,返回在num中的位置下标
int judge(int num[],int score);//判断游戏是否结束
void color(int x);//设置不同数字的颜色
int rjudge(int num[]);//行检索，用于判断是否可输入左右键
int r1judge(int num[]);
int cjudge(int num[]);//列检索，用于判断是否可输入上下键
int c1judge(int num[]);
void print_rule();
int main()
{
    int n;
    srand(time(NULL));
    system("mode con cols=50 lines=27");
    system("color F0");
    print_rule();
    start:scanf("%d",&n);
    if(n==1)
    RunGame();
    else {printf("请输入1开始游戏\n"); goto start;}
    return 0;
}
void print_frame(int num[],int score)
{
    char frame[25][49];
    int c1[12]={1,5,9,13,17,21,25,29,33,37,41,45};
    int c2[3]={12,24,36};
    int c3[24]={2,3,4,6,7,8,14,15,16,18,19,20,26,27,28,30,31,32,38,39,40,42,43,44};
    int c4[8]={10,11,22,23,34,35,46,47};
    int i,j,k;
    for(i=0;i<25;i++)//列初始化
    {
        if(i==0) frame[i][0]='a';
        if(i==24) frame[i][0]='b';
        if(i!=0&&i!=24&&i%6==0) frame[i][0]='e';
        if(i!=0&&i!=24&&i%6!=0) frame[i][0]='k';
    }
    for(i=0;i<25;i++)
    {
        if(i==0) frame[i][48]='c';
        if(i==24) frame[i][48]='d';
        if(i!=0&&i!=24&&i%6==0) frame[i][48]='f';
        if(i!=0&&i!=24&&i%6!=0) frame[i][48]='k';
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<25;j++)
        {
            if(j==0) frame[j][c2[i]]='g';
            if(j==24) frame[j][c2[i]]='h';
            if(j!=0&&j!=24&&j%6==0) frame[j][c2[i]]='i';
            if(j!=0&&j!=24&&j%6!=0) frame[j][c2[i]]='k';
        }
    }
    for(i=0;i<12;i++)
    {
        for(j=0;j<25;j++)
            frame[j][c1[i]]='l';
    }
    for(i=0;i<24;i++)
    {
        for(j=0;j<25;j++)
        {
            if(j%6==0) frame[j][c3[i]]='j';
            if(j%6!=0) frame[j][c3[i]]='l';
        }
    }
    for(i=0;i<8;i++)
    {
        for(j=0;j<25;j++)
        {
            if(j%6==0) frame[j][c4[i]]='j';
            if(j%6!=0) frame[j][c4[i]]='l';
        }
    }
    for(i=0;i<16;i++)
    {
        if(num[i]==0) continue;
        if(num[i]==2)
        {
            for(j=0;j<4;j++)
            frame[(i/4)*6+1][(i%4)*12+4+j]='m';
            frame[(i/4)*6+2][(i%4)*12+8]='m';
            for(j=0;j<3;j++)
            frame[(i/4)*6+3][(i%4)*12+5+j]='m';
            frame[(i/4)*6+4][(i%4)*12+4]='m';
            for(j=0;j<5;j++)
            frame[(i/4)*6+5][(i%4)*12+4+j]='m';
        }
        if(num[i]==4)
        {
            for(j=0;j<2;j++)
            frame[(i/4)*6+1][(i%4)*12+6+j]='o';
            frame[(i/4)*6+2][(i%4)*12+5]='o';frame[(i/4)*6+2][(i%4)*12+7]='o';
            frame[(i/4)*6+3][(i%4)*12+4]='o';frame[(i/4)*6+3][(i%4)*12+7]='o';
            for(j=0;j<5;j++)
            frame[(i/4)*6+4][(i%4)*12+4+j]='o';
            frame[(i/4)*6+5][(i%4)*12+7]='o';
        }
        if(num[i]==8)
        {
            for(j=0;j<3;j++)
            frame[(i/4)*6+1][(i%4)*12+5+j]='q';
            frame[(i/4)*6+2][(i%4)*12+4]='q';frame[(i/4)*6+2][(i%4)*12+8]='q';
            for(j=0;j<3;j++)
            frame[(i/4)*6+3][(i%4)*12+5+j]='q';
            frame[(i/4)*6+4][(i%4)*12+4]='q';frame[(i/4)*6+4][(i%4)*12+8]='q';
            for(j=0;j<3;j++)
            frame[(i/4)*6+5][(i%4)*12+5+j]='q';
        }
        if(num[i]==16)
        {
            frame[(i/4)*6+1][(i%4)*12+4]='s';
            for(j=0;j<3;j++)
            frame[(i/4)*6+1][(i%4)*12+7+j]='s';
            for(j=0;j<2;j++)
            frame[(i/4)*6+2][(i%4)*12+3+j]='s';frame[(i/4)*6+2][(i%4)*12+6]='s';
            frame[(i/4)*6+3][(i%4)*12+4]='s';
            for(j=0;j<4;j++)
            frame[(i/4)*6+3][(i%4)*12+6+j]='s';
            frame[(i/4)*6+4][(i%4)*12+4]='s';frame[(i/4)*6+4][(i%4)*12+6]='s';
            frame[(i/4)*6+4][(i%4)*12+10]='s';
            frame[(i/4)*6+5][(i%4)*12+4]='s';
            for(j=0;j<3;j++)
            frame[(i/4)*6+5][(i%4)*12+7+j]='s';
        }
        if(num[i]==32)
        {
            for(j=0;j<4;j++)
            frame[(i/4)*6+1][(i%4)*12+1+j]='u';
            for(j=0;j<4;j++)
            frame[(i/4)*6+1][(i%4)*12+7+j]='u';
            frame[(i/4)*6+2][(i%4)*12+5]='u';frame[(i/4)*6+2][(i%4)*12+11]='u';
            for(j=0;j<3;j++)
            frame[(i/4)*6+3][(i%4)*12+2+j]='u';
            for(j=0;j<3;j++)
            frame[(i/4)*6+3][(i%4)*12+8+j]='u';
            frame[(i/4)*6+4][(i%4)*12+5]='u';frame[(i/4)*6+4][(i%4)*12+7]='u';
            for(j=0;j<4;j++)
            frame[(i/4)*6+5][(i%4)*12+1+j]='u';
            for(j=0;j<5;j++)
            frame[(i/4)*6+5][(i%4)*12+7+j]='u';
        }
        if(num[i]==64)
        {
            for(j=0;j<3;j++)
            frame[(i/4)*6+1][(i%4)*12+2+j]='w';
            for(j=0;j<2;j++)
            frame[(i/4)*6+1][(i%4)*12+9+j]='w';
            frame[(i/4)*6+2][(i%4)*12+1]='w';frame[(i/4)*6+2][(i%4)*12+8]='w';
            frame[(i/4)*6+2][(i%4)*12+10]='w';
            for(j=0;j<4;j++)
            frame[(i/4)*6+3][(i%4)*12+1+j]='w';
            frame[(i/4)*6+3][(i%4)*12+7]='w';frame[(i/4)*6+3][(i%4)*12+10]='w';
            frame[(i/4)*6+4][(i%4)*12+1]='w';frame[(i/4)*6+4][(i%4)*12+5]='w';
            for(j=0;j<5;j++)
            frame[(i/4)*6+4][(i%4)*12+7+j]='w';
            for(j=0;j<3;j++)
            frame[(i/4)*6+5][(i%4)*12+2+j]='w';frame[(i/4)*6+5][(i%4)*12+10]='w';
        }
        if(num[i]==128)
        {
            frame[(i/4)*6+1][(i%4)*12+2]='y';
            for(j=0;j<3;j++)
            frame[(i/4)*6+1][(i%4)*12+4+j]='y';
            for(j=0;j<2;j++)
            frame[(i/4)*6+1][(i%4)*12+9+j]='y';
            frame[(i/4)*6+2][(i%4)*12+2]='y';frame[(i/4)*6+2][(i%4)*12+6]='y';
            frame[(i/4)*6+2][(i%4)*12+8]='y';frame[(i/4)*6+2][(i%4)*12+11]='y';
            frame[(i/4)*6+3][(i%4)*12+2]='y';
            for(j=0;j<3;j++)
            frame[(i/4)*6+3][(i%4)*12+4+j]='y';
            for(j=0;j<2;j++)
            frame[(i/4)*6+3][(i%4)*12+9+j]='y';
            frame[(i/4)*6+4][(i%4)*12+2]='y';frame[(i/4)*6+4][(i%4)*12+4]='y';
            frame[(i/4)*6+4][(i%4)*12+8]='y';frame[(i/4)*6+4][(i%4)*12+11]='y';
            frame[(i/4)*6+5][(i%4)*12+2]='y';
            for(j=0;j<3;j++)
            frame[(i/4)*6+5][(i%4)*12+4+j]='y';
            for(j=0;j<2;j++)
            frame[(i/4)*6+5][(i%4)*12+9+j]='y';
        }
        if(num[i]==256)
        {
            for(j=0;j<3;j++)
            frame[(i/4)*6+1][(i%4)*12+1+j]='0';
            for(j=0;j<3;j++)
            frame[(i/4)*6+1][(i%4)*12+5+j]='0';
            for(j=0;j<3;j++)
            frame[(i/4)*6+1][(i%4)*12+9+j]='0';
            frame[(i/4)*6+2][(i%4)*12+3]='0';frame[(i/4)*6+2][(i%4)*12+5]='0';
            frame[(i/4)*6+2][(i%4)*12+9]='0';
            for(j=0;j<3;j++)
            frame[(i/4)*6+3][(i%4)*12+1+j]='0';
            for(j=0;j<3;j++)
            frame[(i/4)*6+3][(i%4)*12+5+j]='0';
            for(j=0;j<3;j++)
            frame[(i/4)*6+3][(i%4)*12+9+j]='0';
            frame[(i/4)*6+4][(i%4)*12+1]='0';frame[(i/4)*6+4][(i%4)*12+7]='0';
            frame[(i/4)*6+4][(i%4)*12+9]='0';frame[(i/4)*6+4][(i%4)*12+11]='0';
            for(j=0;j<3;j++)
            frame[(i/4)*6+5][(i%4)*12+1+j]='0';
            for(j=0;j<3;j++)
            frame[(i/4)*6+5][(i%4)*12+5+j]='0';
            for(j=0;j<3;j++)
            frame[(i/4)*6+5][(i%4)*12+9+j]='0';
        }
        if(num[i]==512)
        {
            for(j=0;j<3;j++)
            frame[(i/4)*6+1][(i%4)*12+2+j]='2';frame[(i/4)*6+1][(i%4)*12+6]='2';
            for(j=0;j<3;j++)
            frame[(i/4)*6+1][(i%4)*12+8+j]='2';
            frame[(i/4)*6+2][(i%4)*12+2]='2';frame[(i/4)*6+2][(i%4)*12+6]='2';
            frame[(i/4)*6+2][(i%4)*12+10]='2';
            for(j=0;j<3;j++)
            frame[(i/4)*6+3][(i%4)*12+2+j]='2';frame[(i/4)*6+3][(i%4)*12+6]='2';
            for(j=0;j<3;j++)
            frame[(i/4)*6+3][(i%4)*12+8+j]='2';
            frame[(i/4)*6+4][(i%4)*12+4]='2';frame[(i/4)*6+4][(i%4)*12+6]='2';
            frame[(i/4)*6+4][(i%4)*12+8]='2';
            for(j=0;j<3;j++)
            frame[(i/4)*6+5][(i%4)*12+2+j]='2';frame[(i/4)*6+5][(i%4)*12+6]='2';
            for(j=0;j<3;j++)
            frame[(i/4)*6+5][(i%4)*12+8+j]='2';
        }
        if(num[i]==1024)
        {
            frame[(i/4)*6+1][(i%4)*12+1]='4';
            for(j=0;j<3;j++)
            frame[(i/4)*6+1][(i%4)*12+3+j]='4';
            for(j=0;j<2;j++)
            frame[(i/4)*6+1][(i%4)*12+7+j]='4';
            for(j=0;j<2;j++)
            frame[(i/4)*6+1][(i%4)*12+10+j]='4';
            frame[(i/4)*6+2][(i%4)*12+1]='4';frame[(i/4)*6+2][(i%4)*12+3]='4';
            frame[(i/4)*6+2][(i%4)*12+5]='4';frame[(i/4)*6+2][(i%4)*12+8]='4';
            for(j=0;j<2;j++)
            frame[(i/4)*6+2][(i%4)*12+10+j]='4';
            frame[(i/4)*6+3][(i%4)*12+1]='4';frame[(i/4)*6+3][(i%4)*12+3]='4';
            frame[(i/4)*6+3][(i%4)*12+5]='4';
            for(j=0;j<2;j++)
            frame[(i/4)*6+3][(i%4)*12+7+j]='4';
            for(j=0;j<2;j++)
            frame[(i/4)*6+3][(i%4)*12+10+j]='4';
            frame[(i/4)*6+4][(i%4)*12+1]='4';frame[(i/4)*6+4][(i%4)*12+3]='4';
            frame[(i/4)*6+4][(i%4)*12+5]='4';frame[(i/4)*6+4][(i%4)*12+7]='4';
            for(j=0;j<2;j++)
            frame[(i/4)*6+4][(i%4)*12+10+j]='4';
            frame[(i/4)*6+5][(i%4)*12+1]='4';
            for(j=0;j<3;j++)
            frame[(i/4)*6+5][(i%4)*12+3+j]='4';
            for(j=0;j<2;j++)
            frame[(i/4)*6+5][(i%4)*12+7+j]='4';frame[(i/4)*6+5][(i%4)*12+11]='4';
        }
    }
    for(i=0;i<25;i++)
    {
        for(j=0;j<49;j++)
            switch(frame[i][j])
            {
                case 'a':color(240);printf("┏");break;
                case 'b':color(240);printf("┗");break;
                case 'c':color(240);printf("┓");break;
                case 'd':color(240);printf("┛");break;
                case 'e':color(240);printf("┣");break;
                case 'f':color(240);printf("┫");break;
                case 'g':color(240);printf("┳");break;
                case 'h':color(240);printf("┻");break;
                case 'i':color(240);printf("╋");break;
                case 'j':color(240);printf("━");break;
                case 'k':color(240);printf("┃");break;
                case 'l':color(240);printf(" ");break;
                case 'm':color(112);printf("@");break;//数字2对应的方块
                case 'o':color(224);printf("@");break;//数字4对应的方块
                case 'q':color(207);printf("@");break;//数字8对应的方块
                case 's':color(207);printf("@");break;//数字16对应的方块
                case 'u':color(79);printf("@");break;//数字32对应的方块
                case 'w':color(79);printf("@");break;//数字64对应的方块
                case 'y':color(224);printf("@");break;//数字128对应的方块
                case '0':color(111);printf("@");break;//数字256对应的方块
                case '2':color(111);printf("@");break;//数字512对应的方块
                case '4':color(207);printf("@");break;//数字1024对应的方块
            }
        putchar('\n');
    }
    printf("SCORE: %d\n",score);
}
int rand_number_4_2()
{
    int x,N=10,probability[10]={2,2,2,2,2,2,2,2,2,4};
    x=rand();
    x=x%N;
    return probability[x];
}
int chooce(int num[])
{
    int i,j,position[16],x;
    for(i=0,j=0;i<16;i++)
    {
        if(num[i]==0)
            position[j++]=i;
    }
    x=rand();
    x=x%j;
    return position[x];
}
int judge(int num[],int score)
{
    int i,j,flag;
    for(i=0;i<16;i++)
        if(num[i]==2048)
        {
            system("cls");
            flag=0;
            printf("THE 2048 APPEARS! YOU WIN!!! YOU SCORE IS %d\n",score);
            return flag;
        }
    for(i=0;i<16;i++)
    {
        if(num[i]==0)
        {
            flag=1;
            return flag;
        }
    }
    for(i=0;i<4;i++)//列检索
    {
        for(j=0;j<3;j++)
            if(num[i+j*4]==num[i+(j+1)*4])
            {
                flag=1;
                return flag;
            }
    }
    for(i=0;i<=12;i+=4)//行检索
    {
        for(j=0;j<3;j++)
            if(num[i+j]==num[i+j+1])
            {
                flag=1;
                return flag;
            }
    }
    printf("GAME OVER! YOUR SCORE IS %d\n",score);
    return 0;
}
void color(int x)
{
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);//设置不同数字的颜色
}
void RunGame()
{
    int num[16],i,j,k,position,ch,flag,score=0;//flag判断游戏是否结束,0代表结束,1代表继续
    int rflag,cflag,r1flag,c1flag,upflag,downflag,leftflag,rightflag;//rflag,cflag用于判断上下左右键输入的可行性
    for(i=0;i<16;i++)
        num[i]=0;
    for(;;)
    {
        position=chooce(num);
        num[position]=rand_number_4_2();
        rflag=rjudge(num);cflag=cjudge(num);
        r1flag=r1judge(num);c1flag=c1judge(num);
        system("cls");
        print_frame(num,score);
        flag=judge(num,score);
        if(flag==0) break;
        begin:ch=getch();
        if(ch==224)
        {
            ch=getch();
            if(ch==0x48)//输入“上“
            {
                upflag=0;
                if(cflag==0) {printf("请输入左右键\n");goto begin;}
                for(i=0;i<4;i++)
                    {
                        if(num[i]==0&&(!(num[i+4]==0&&num[i+8]==0&&num[i+12]==0))) {upflag=1;goto begin1;}
                        else
                        {
                            if((num[i+4]==0&&num[i+8]!=0&&num[i+12]==0)||(num[i+4]==0&&num[i+8]==0&&num[i+12]!=0)||(num[i+4]!=0&&num[i+8]==0&&num[i+12]!=0)||(num[i+4]==0&&num[i+8]!=0&&num[i+12]!=0))
                            {upflag=1;goto begin1;}
                        }
                    }
                    if(c1flag==1) goto begin1;
                    if(upflag==0) {printf("请输入下左右键\n");goto begin;}
             begin1:for(i=0;i<4;i++)
                    for(j=1;j<=3;j++)
                    if(num[i+j*4-4]==0)
                    {
                        num[i+j*4-4]=num[i+j*4];
                        num[i+j*4]=0;
                    }
                for(i=0;i<4;i++)
                    for(j=1;j<=3;j++)
                    if(num[i+j*4-4]==0)
                    {
                        num[i+j*4-4]=num[i+j*4];
                        num[i+j*4]=0;
                    }
                for(i=0;i<4;i++)
                    for(j=1;j<=3;j++)
                    if(num[i+j*4-4]==0)
                    {
                        num[i+j*4-4]=num[i+j*4];
                        num[i+j*4]=0;
                    }
                for(i=0;i<4;i++)
                    for(j=1;j<=3;j++)
                    if(num[i+j*4-4]==num[i+j*4])
                    {
                        num[i+j*4-4]*=2;
                        score+=num[i+j*4-4];
                        num[i+j*4]=0;
                        for(k=j+1;k<=3;k++)
                            if(num[i+k*4-4]==0)
                            {
                                num[i+k*4-4]=num[i+k*4];
                                num[i+k*4]=0;
                            }
                    }
            }
            if(ch==0x50)//输入”下”
            {
                downflag=0;
                if(cflag==0) {printf("请输入左右键\n");goto begin;}
                for(i=12;i<16;i++)
                {
                    if(num[i]==0&&(!(num[i-4]==0&&num[i-8]==0&&num[i-12]==0))) {downflag=1;goto begin2;}
                    else
                    {
                        if((num[i-4]==0&&num[i-8]!=0&&num[i-12]==0)||(num[i-4]==0&&num[i-8]==0&&num[i-12]!=0)||(num[i-4]!=0&&num[i-8]==0&&num[i-12]!=0)||(num[i-4]==0&&num[i-8]!=0&&num[i-12]!=0))
                        {
                            downflag=1;goto begin2;
                        }
                    }
                }
                if(c1flag==1) goto begin2;
                if(downflag==0) {printf("请输入上左右键\n");goto begin;}
             begin2:for(i=12;i<16;i++)
                    for(j=1;j<=3;j++)
                    if(num[i-j*4+4]==0)
                    {
                        num[i-j*4+4]=num[i-j*4];
                        num[i-j*4]=0;
                    }
                for(i=12;i<16;i++)
                    for(j=1;j<=3;j++)
                    if(num[i-j*4+4]==0)
                    {
                        num[i-j*4+4]=num[i-j*4];
                        num[i-j*4]=0;
                    }
                for(i=12;i<16;i++)
                    for(j=1;j<=3;j++)
                    if(num[i-j*4+4]==0)
                    {
                        num[i-j*4+4]=num[i-j*4];
                        num[i-j*4]=0;
                    }
                for(i=12;i<16;i++)
                    for(j=1;j<=3;j++)
                    if(num[i-j*4+4]==num[i-j*4])
                    {
                        num[i-j*4+4]*=2;
                        score+=num[i-j*4+4];
                        num[i-j*4]=0;
                        for(k=j+1;k<=3;k++)
                            if(num[i-k*4+4]==0)
                            {
                                num[i-k*4+4]=num[i-k*4];
                                num[i-k*4]=0;
                            }
                    }
            }
            if(ch==0x4b)//输入“左”
            {
                leftflag=0;
                if(rflag==0) {printf("请输入上下键\n");goto begin;}
                for(i=0;i<=12;i+=4)
                    {
                        if(num[i]==0&&(!(num[i+1]==0&&num[i+2]==0&&num[i+3]==0))) {leftflag=1;goto begin3;}
                        else if((num[i+1]==0&&num[i+2]!=0&&num[i+3]==0)||(num[i+1]==0&&num[i+2]==0&&num[i+3]!=0)||(num[i+1]==0&&num[i+2]!=0&&num[i+3]!=0)||(num[i+1]!=0&&num[i+2]==0&&num[i+3]!=0))
                        {
                            leftflag=1;
                            goto begin3;
                        }
                    }
                    if(r1flag==1) goto begin3;
                    if(leftflag==0) {printf("请输入上下右键\n");goto begin;}
             begin3:for(i=0;i<=12;i+=4)
                    for(j=1;j<=3;j++)
                    {
                        if(num[i+j-1]==0)
                        {
                            num[i+j-1]=num[i+j];
                            num[i+j]=0;
                        }
                    }
                for(i=0;i<=12;i+=4)
                    for(j=1;j<=3;j++)
                    {
                        if(num[i+j-1]==0)
                        {
                            num[i+j-1]=num[i+j];
                            num[i+j]=0;
                        }
                    }
                for(i=0;i<=12;i+=4)
                    for(j=1;j<=3;j++)
                    {
                        if(num[i+j-1]==0)
                        {
                            num[i+j-1]=num[i+j];
                            num[i+j]=0;
                        }
                    }
                for(i=0;i<=12;i+=4)
                    for(j=1;j<=3;j++)
                    if(num[i+j-1]==num[i+j])
                    {
                        num[i+j-1]*=2;
                        score+=num[i+j-1];
                        num[i+j]=0;
                        for(k=j+1;k<=3;k++)
                            if(num[i+k-1]==0)
                            {
                                num[i+k-1]=num[i+k];
                                num[i+k]=0;
                            }
                    }
            }
            if(ch==0x4d)//输入“右”
            {
                rightflag=0;
                if(rflag==0) {printf("请输入上下键\n");goto begin;}
                for(i=3;i<=15;i+=4)
                {
                    if(num[i]==0&&(!(num[i-1]==0&&num[i-2]==0&&num[i-3]==0))) {rightflag=1;goto begin4;}
                    else if((num[i-1]==0&&num[i-2]!=0&&num[i-3]==0)||(num[i-1]==0&&num[i-2]==0&&num[i-3]!=0)||(num[i-1]!=0&&num[i-2]==0&&num[i-3]!=0)||(num[i-1]==0&&num[i-2]!=0&&num[i-3]!=0))
                    {
                        rightflag=1;
                        goto begin4;
                    }
                }
                if(r1flag==1) goto begin4;
                if(rightflag==0) {printf("请输入上下左键\n");goto begin;}
             begin4:for(i=3;i<=15;i+=4)
                    for(j=1;j<=3;j++)
                    if(num[i-j+1]==0)
                    {
                        num[i-j+1]=num[i-j];
                        num[i-j]=0;
                    }
                for(i=3;i<=15;i+=4)
                    for(j=1;j<=3;j++)
                    if(num[i-j+1]==0)
                    {
                        num[i-j+1]=num[i-j];
                        num[i-j]=0;
                    }
                for(i=3;i<=15;i+=4)
                    for(j=1;j<=3;j++)
                    if(num[i-j+1]==0)
                    {
                        num[i-j+1]=num[i-j];
                        num[i-j]=0;
                    }
                for(i=3;i<=15;i+=4)
                    for(j=1;j<=3;j++)
                    if(num[i-j+1]==num[i-j])
                    {
                        num[i-j+1]*=2;
                        score+=num[i-j+1];
                        num[i-j]=0;
                        for(k=j+1;k<=3;k++)
                            if(num[i-k+1]==0)
                            {
                                num[i-k+1]=num[i-k];
                                num[i-k]=0;
                            }
                    }
            }
        }
        else if(ch!=224){printf("请输入正确的方向键\n");goto begin;}
    }
}
int cjudge(int num[])
{
    int flag,i,j;
    for(i=0;i<4;i++)//列检索
    {
        if(num[i]!=0&&num[i+4]!=0&&num[i+8]!=0&&num[i+12]!=0)
        {for(j=0;j<3;j++)
            if(num[i+j*4]==num[i+(j+1)*4])
            {
                flag=1;
                return flag;
            }}
        else {flag=1;return flag;}
    }
    return 0;
}
int c1judge(int num[])
{
    int flag,i,j;
    for(i=0;i<4;i++)//列检索
    {
        for(j=0;j<3;j++)
            if(num[i+j*4]==num[i+(j+1)*4]&&num[i+j*4]!=0)
            {
                flag=1;
                return flag;
            }
    }
    return 0;
}
int rjudge(int num[])
{
    int flag,i,j;
    for(i=0;i<=12;i+=4)//行检索
    {
        if(num[i]!=0&&num[i+1]!=0&&num[i+2]!=0&&num[i+3]!=0)
        {for(j=0;j<3;j++)
            if(num[i+j]==num[i+j+1])
            {
                flag=1;
                return flag;
            }}
        else {flag=1;return flag;}
    }
    return 0;
}
int r1judge(int num[])
{
    int flag,i,j;
    for(i=0;i<=12;i+=4)//行检索
    {
        for(j=0;j<3;j++)
            if(num[i+j]==num[i+j+1]&&num[i+j]!=0)
            {
                flag=1;
                return flag;
            }
    }
    return 0;
}
void print_rule()
{
    printf("Game Name: 2048\n\n");
    printf("Rule:\n1.游戏共有16个格子,初始时初始数字由2或者4构成\n\n");
    printf("2.键盘输入↑ ↓ ← →，所有格子会向那个方向运动\n\n");
    printf("3.相同数字的两个格子，相撞时数字会相加\n\n");
    printf("4.每次移动时,空白处会随机刷新出一个数字(2或4)格子\n\n");
    printf("5.当界面不可运动时（当界面全部被数字填满时），游戏结束；当出现数字2048时，游戏胜利\n\n");
    printf("输入1开始游戏:");
}
